﻿using System;
using System.Collections.Generic;
using System.Data.Objects;
using System.Linq;
using System.Data.Entity;
using System.Text;
using EFData;
using EFDbContext;
using EFTracingProvider;

namespace EFTest
{
    class Program
    {
        static void Main(string[] args)
        {
            DbContextTrace();
            ObjectContextTrace();
        }

        /// <summary>
        /// Anzeigen der passenden SQL Funktionen die aufgerufen wurden, mit Hilfe des DbContext
        /// </summary>
        public static void DbContextTrace()
        {
            //Einstellen wo das Log ausgegeben werden soll
            EFTracingProviderConfiguration.LogToConsole = true;

            //http://code.msdn.microsoft.com/EFProviderWrappers
            //Neues Datenmodell erstellen, Achtung es muss nur ConnectionString in der App.Config "ModelContainer" angepasst werden.
            ModelDbContextContainer modelDbContext = new ModelDbContextContainer("ModelDbContextContainer");
            //Beim Ersten ausführen auskommentieren und evtl. mit CreateDB ersetzten, macht probleme mit dem Wrapper
            //modelDbContext.Database.CreateIfNotExists();

            //Neues Objekt erstellen und der DB hinzufügen
            Haus haus = new Haus() { Nummer = "31a", Strasse = "Altenberger Straße" };
            modelDbContext.HausMenge.Add(haus);
            //Wird auf der Konsole ausgegeben, wenn Save Changes aufgerufen wird.
            modelDbContext.SaveChanges();
            Console.ReadLine();

            //Abfrage erstellen
            var houses = from eHouse in modelDbContext.HausMenge where eHouse.Nummer == "31a" select eHouse;
            Console.Write(houses.ToString());
            Console.ReadLine();

            //Auf die Abfrage zugreifen, damit diese auch in der Konsole ausgegeben wird.
            foreach (Haus hause in houses)
            {
                string name = hause.Nummer;
            }
        }

        /// <summary>
        /// Anzeigen der passenden SQL Funktionen die aufgerufen wurden, mit Hilfe des ObjectContext
        /// </summary>
        public static void ObjectContextTrace()
        {
            //Neues Datenmodell erstellen, Achtung es muss nur ConnectionString in der App.Config "ModelContainer" angepasst werden.
            //die DB wird dann von "allein" angelegt.
            ModelContainer model = new ModelContainer();
            //Wenn die DB noch nicht existiert, wird diese angelegt
            if (!model.DatabaseExists())
            {
                model.CreateDatabase();
            }

            //Das Anlegen eines Objektes auslesen als SQL Statement
            Person person = new Person() { Name = "Müller", Vorname = "Max" };
            model.PersonMenge.AddObject(person);
            Console.Write(model.ToTraceString());
            model.SaveChanges();
            Console.ReadLine();

            //Eine Abfrage auslesen als SQL Statement.
            var namen = from ePerson in model.PersonMenge where ePerson.Name == "Müller" select ePerson;
            Console.Write(namen.ToTraceString());
            Console.ReadLine();
        }
    }
}
